/**
 * 全局状态管理
 * 使用 Vue 3 的 reactive 和 computed 实现简单的状态管理
 */

import { reactive, computed } from 'vue'
import { userApi } from './api.js'
import TokenManager from './token.js'

// 全局状态
const state = reactive({
  // 用户信息
  userInfo: null,
  // 可用余额
  availableBalance: 0,
  // 加载状态
  isLoadingUserInfo: false,
  isLoadingBalance: false
})

// 计算属性
const getters = {
  // 格式化的可用余额（带千分位分隔符）
  formattedBalance: computed(() => {
    return formatCurrency(state.availableBalance)
  }),
  
  // 用户是否已登录
  isLoggedIn: computed(() => {
    return !!state.userInfo && !!TokenManager.getToken()
  })
}

// 操作方法
const actions = {
  // 设置用户信息
  setUserInfo(userInfo) {
    state.userInfo = userInfo
    if (userInfo && userInfo.availableBalance !== undefined) {
      state.availableBalance = parseFloat(userInfo.availableBalance) || 0
    }
    // 同时保存到本地存储
    TokenManager.setUserInfo(userInfo)
  },

  // 设置可用余额
  setAvailableBalance(balance) {
    state.availableBalance = parseFloat(balance) || 0
  },

  // 获取用户详细信息
  async fetchUserInfo() {
    if (state.isLoadingUserInfo) return
    
    try {
      state.isLoadingUserInfo = true
      const response = await userApi.getUserDetail()
      
      if (response && response.code === 0 && response.data) {
        this.setUserInfo(response.data)
        return response.data
      } else {
        console.error('获取用户信息失败:', response?.msg)
        throw new Error(response?.msg || '获取用户信息失败')
      }
    } catch (error) {
      console.error('获取用户信息失败:', error)
      throw error
    } finally {
      state.isLoadingUserInfo = false
    }
  },

  // 刷新可用余额
  async refreshBalance() {
    if (state.isLoadingBalance) return
    
    try {
      state.isLoadingBalance = true
      const response = await userApi.getUserDetail()
      
      if (response && response.code === 0 && response.data) {
        this.setAvailableBalance(response.data.availableBalance)
        return response.data.availableBalance
      } else {
        console.error('获取余额失败:', response?.msg)
        throw new Error(response?.msg || '获取余额失败')
      }
    } catch (error) {
      console.error('获取余额失败:', error)
      throw error
    } finally {
      state.isLoadingBalance = false
    }
  },

  // 清除用户信息
  clearUserInfo() {
    state.userInfo = null
    state.availableBalance = 0
    TokenManager.clearUserInfo()
  },

  // 初始化用户信息（从本地存储恢复）
  initUserInfo() {
    const userInfo = TokenManager.getUserInfo()
    if (userInfo) {
      this.setUserInfo(userInfo)
    }
  }
}

// 工具函数：格式化货币
function formatCurrency(amount, decimals = 2) {
  if (amount === null || amount === undefined || isNaN(amount)) {
    return '0.00'
  }
  
  const num = parseFloat(amount)
  return num.toLocaleString('en-US', {
    minimumFractionDigits: decimals,
    maximumFractionDigits: decimals
  })
}

// 导出全局状态管理
export default {
  state,
  getters,
  actions,
  formatCurrency
}